package miniAES;

public class enCry {
    private enCry(){}
    //private static byte[] mixColumnOutput=new byte [4];

    //带列混淆的加密操作
    public static byte[] oneEnCry(byte[] input, byte[] subKey){
        byte[] mixColumnOutput =new byte[4];

        //S盒
        input=assembly.nibbleSub(input);
        //行移位
        input=assembly.shiftRow(input);
        //列混淆
        mixColumnOutput=assembly.mixColumn(input,mixColumnOutput);
        //密钥加
        input=assembly.keyAddition(mixColumnOutput,subKey);

        return input;
    }
    //不带列混淆的加密操作
    public static byte [] noMixColumnCry(byte[] input, byte[] subKey){
        //S盒
        input=assembly.nibbleSub(input);
        //行移位
        input=assembly.shiftRow(input);
        //密钥加
        input=assembly.keyAddition(input,subKey);
        return input;
    }
    //r轮的加密操作，最后一轮不带列混淆 round表示密钥的个数
    public static byte[] cryRround(byte[] input, byte[][] subKey,int round){
        //白化密钥
        input=assembly.keyAddition(input,subKey[0]);
        //assembly.printBin(input,4);
        //前r轮
        for (int i = 1; i < round-1; i++) {
            input=oneEnCry(input,subKey[i]);
            assembly.printBin(input,4);
        }
        //最后一轮
        return noMixColumnCry(input,subKey[round-1]);
    }
}
